/*!
 * manualTimeTable
 * 
 * http://git.oschina.net/cylansad/manualTimeTable
 * 
 */
define(function(require) {

    // 其他模块引用的对象将作为属性统一放到_module中
    var _module = {
        jxbTimeTable: require('./modules/jxbTimeTable'),
        zeroModal: require('../zeroModal/zeroModal'),
        paramsValidator: require('./modules/paramsValidator')
    };

    var manualTimeTable = function(opt) {
        this.params = {
            container: '',
            weeks: false,
            units: false,
            loadWeeksUrl: false,
            loadUnitsUrl: false,
            convertWeeksFunc: false, // 与loadWeeksUrl配合使用，用于通过ajax获取数据后，对数据进行转换的函数
            convertUnitsFunc: false, // 与loadUnitsUrl配合使用，用于通过ajax获取数据后，对数据进行转换的函数
            readOnly: false,
            weekNum: undefined,
            weekName: undefined,
            conflictChecker: function(data) { // 拖动课程安排的冲突验证事件
                var deferred = $.Deferred();
                console.log(data.currentArrange);
                console.log(data.movedPosition);

                var success = 0;
                var conflict = '***教室已被占用';
                if (success === 1) {
                    deferred.resolve(success);
                } else {
                    _module.zeroModal.confirm({
                        content: conflict + '，强制安排吗？',
                        okFn: function() {
                            deferred.resolve(1);
                        }
                    });
                }
                return deferred;
            }
        };
        this.init(opt);

        // 调用参数验证器
        _module.paramsValidator.validate();
    };

    manualTimeTable.prototype = {

        init: function(opt) {
            $.extend(this.params, opt);

            // 拖拽移动的事件
            $(document).dragover(function(e) {
                e.preventDefault();
            });
        },

        /**
         * 根据教学班信息绘制星期节次二维表
         * @param  {[object]} jxbInfo [教学班信息] 
         *                            {  
         *                                wid: '3B571DC02925FDC2E050007F01001565',
         *                                jxbid: '011121312',       // 教学班ID
         *                                jxbmc: '01-大学英语',      // 教学班显示名称 
         *                                period: 32,               // 学时
         *                                unitMode: 2               // 节次模式，默认1，2为两节连排，3为三节连排
         *                            }
         * @return {[type]}         [description]
         */
        render: function(jxbInfo) {
            _module.jxbTimeTable.renderWeekUnitTable(this.params, jxbInfo);
        },

        /**
         * 根据屏蔽时间信息渲染星期节次二维表
         * @param  {[type]} obstacles [description]
         *                            [
         *                                {
         *                                    weekNum: '101010100000000000000000000000',
         *                                    weekName: '1-7单周',
         *                                    week: '1',
         *                                    description: '**周**班已屏蔽该时间片',
         *                                    beginUnit: '5',
         *                                    endUnit: '6'
         *                                }
         *                            ]
         * @return {[type]}           [description]
         */
        renderObstacles: function(obstacles) {
            _module.jxbTimeTable.renderObstacles(obstacles);
        },

        /**
         * 根据排课结果渲染星期节次二维表
         * @param  {[array]} arranges [排课结果集合]
         *                            [
         *                                { 
         *                                    jxbid: '011121312', 
         *                                    jxbmc: '01-大学英语',
         *                                    teacherId:'01113120',
         *                                    teacherName: '张三',
         *                                    classroomId:'101', 
         *                                    classroomName: '101室', 
         *                                    weekNum: '101010100000000000000000000000', 
         *                                    weekName: '1-7单周', 
         *                                    week: '2',
         *                                    beginUnit: '1', 
         *                                    endUnit: '2' 
         *                                }
         *                            ]
         * @return {[type]}          [description]
         */
        renderArranges: function(arranges) {
            _module.jxbTimeTable.renderArranges(arranges);
        },


        /**
         * 设置当前选择的周次信息
         * @param {[type]} weekNumName [description]
         *                             {
         *                                 weekNum: '101010100000000000000000000000',
         *                                 weekName: '1-7单周'
         *                             }
         */
        setWeekNumName: function(weekNumName) {
            this.params.weekNum = weekNumName.weekNum;
            this.params.weekName = weekNumName.weekName;
            _module.jxbTimeTable.refreshCurrentOpt(this.params);
        },

        /**
         * 设置当前选择的排课结果内容
         * @param {[type]} arrangeOrObj [排课结果，需要改变排课结果的哪些属性，就传哪些属性]
         *                         {
         *                             ...
         *                         }
         */
        setSeletedArranges: function(arrangeOrObj) {
            _module.jxbTimeTable.setSeletedArranges(arrangeOrObj);
        },

        /**
         * 移除当前选择的排课结果内容
         * @return {[type]} [description]
         */
        removeSeletedArranges: function() {
            _module.jxbTimeTable.removeSeletedArranges();
        },

        /**
         * 获取当前的课程安排结果
         * @return {[type]} [description]
         */
        getArranges: function() {
            return _module.jxbTimeTable._current.arranges;
        },

        /**
         * 获取当前选中的课程安排结果
         * @return {[type]} [description]
         */
        getSelectedArranges: function() {
            return _module.jxbTimeTable._current.selectedArranges;
        },

        /**
         * 刷新原始的课程安排结果
         * 刷新后，原始的课程安排结果将和当前的课程安排结果一致，该方法建议在将结果保存到数据库后调用
         * @return {[type]} [description]
         */
        refreshOriginalArranges: function() {
            _module.jxbTimeTable._current.originalArranges = _module.jxbTimeTable._current.arranges;
            this.renderArranges();
        }

    };

    return manualTimeTable;

});
